/**
 * 3.函数类型
 */

/**
 * 一、函数的两种声明方式
 * 通过function关键词来进行声明
 */
function sum(a: string, b: string): string {
    return a + b;
}
sum("a", "n");
// 可以用来限制函数的参数和返回值类型

// 通过表达式方式声明
type Sum = (a1: string, b1: string) => string;
let sum1: Sum = (a: string, b: string) => {
    return a + b;
};

/**
 * 二、可选参数
 */
let sum2 = (a: string, b?: string): string => {
    return a + b;
};
sum2("a"); // 可选参数必须在其他参数的最后面

/**
 * 三、默认参数
 */
let sum3 = (a: string, b: string = "b"): string => {
    return a + b;
}
sum3("a"); // 默认参数必须在其他参数的最后面

/**
 * 四、剩余参数
 */
const sum4 = (...args: string[]): string => {
    return args.reduce((memo, current) => memo += current, "");
}
sum4("a", "b", "c", "d");

/**
 * 五、函数的重载
 */
function toArray(value: number): number[]
function toArray(value: string): string[]
function toArray(value: number | string) {
    if (typeof value === "string") {
        return value.split("");
    } else {
        return value.toString().split("").map(item => Number(item));
    }
}
toArray(123); // 根据传入不同类型的数据 返回不同的结果
toArray("123");
